
package Proyecto;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;


public class ProyectoGUI extends JFrame implements ActionListener{
    
    JMenuBar barra;
    JMenu archivo,algoritmo,acerca,noInformado,informado;
    JMenuItem abrir,salir,amplitud,costo,profundidad,avara,aEstrella,autores;
    Container contenedor;
    JPanel pCanvas,pDerecho,pInfo;
    JLabel nodos,prof,tiempo,tNodo,tProf,tTiempo;
    JTextArea nAlgoritmo;
    JButton ejecutar;
    String matriz[][];
    ProyectoCanvas canvas;
    
    public ProyectoGUI(){
        super("Gestor de Parqueadero Inteligente");
        
        contenedor= getContentPane();
        contenedor.setLayout(new FlowLayout());
        barra = new JMenuBar();
        
        archivo = new JMenu("Archivo");
        algoritmo = new JMenu("Algoritmo");
        algoritmo.setEnabled(false);
        acerca = new JMenu("Acerca de");
        
        abrir = new JMenuItem("Abrir");
        abrir.addActionListener(this);
        salir = new JMenuItem("Salir");
        salir.addActionListener(this);
        archivo.add(abrir);
        archivo.add(salir);
        
        noInformado = new JMenu("No Informado");
        informado = new JMenu("Informado");
        amplitud = new JMenuItem("Preferente por amplitud");
        amplitud.addActionListener(this);
        costo = new JMenuItem("Costo uniforme");
        costo.addActionListener(this);
        profundidad = new JMenuItem("Preferente por profundidad evitando ciclos");
        profundidad.addActionListener(this);
        avara = new JMenuItem("Avara");
        avara.addActionListener(this);
        aEstrella = new JMenuItem("A*");
        aEstrella.addActionListener(this);
        autores = new JMenuItem("Autores");
        autores.addActionListener(this);
        
        pCanvas = new JPanel(new BorderLayout());
        pCanvas.setPreferredSize(new Dimension(500,500));
        pCanvas.setBackground(Color.WHITE);
        
        
        pDerecho = new JPanel(new FlowLayout());
        pDerecho.setPreferredSize(new Dimension(300,300));
        
        pInfo = new JPanel(new GridLayout(3,2,10,10));
        
        nAlgoritmo = new JTextArea();
        nAlgoritmo.setLineWrap(true);
        nAlgoritmo.setWrapStyleWord(true);
        nAlgoritmo.setEditable(false);
        nAlgoritmo.setOpaque(false);
        nAlgoritmo.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        nAlgoritmo.setPreferredSize(new Dimension(200,80));
        nAlgoritmo.setFont(new Font("Impact",Font.PLAIN,25));
        tNodo = new JLabel("Nodos Expandidos:");
        nodos = new JLabel();
        tProf = new JLabel("Profundidad del arbol:");
        prof = new JLabel();
        tTiempo = new JLabel("Tiempo de computo:");
        tiempo = new JLabel();
        
        ejecutar = new JButton("Ejecutar Algoritmo");
        ejecutar.addActionListener(this);
        ejecutar.setEnabled(false);
        
        pInfo.add(tNodo);
        pInfo.add(nodos);
        pInfo.add(tProf);
        pInfo.add(prof);
        pInfo.add(tTiempo);
        pInfo.add(tiempo);
        
        pDerecho.add(nAlgoritmo);
        pDerecho.add(pInfo);
        pDerecho.add(ejecutar);
        
        
        noInformado.add(amplitud);
        noInformado.add(costo);
        noInformado.add(profundidad);
        informado.add(avara);
        informado.add(aEstrella);
        
        algoritmo.add(noInformado);
        algoritmo.add(informado);
        acerca.add(autores);
        
        barra.add(archivo);
        barra.add(algoritmo);
        barra.add(acerca);
        
        contenedor.add(pCanvas);
        contenedor.add(pDerecho);
        
        setJMenuBar(barra);
        setVisible(true);
        pack();
//        setSize(700,500);
        setLocationRelativeTo(null);
    }
    
    public static void main(String args[]) {

	 JFrame.setDefaultLookAndFeelDecorated(true);
	 SwingUtilities.invokeLater(new Runnable() {

            @Override
	     public void run() {
		  try {
		      //UIManager.setLookAndFeel("org.pushingpixels.substance.api.skin.SubstanceSaharaLookAndFeel");
		      UIManager.setLookAndFeel("org.pushingpixels.substance.api.skin.SubstanceRavenLookAndFeel");
		  } catch (Exception e) {
		      System.out.println("Look and Feel failed to initialize");
		  }
		  ProyectoGUI g = new ProyectoGUI();
		  g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	     }
	 });

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == autores) {
	     JOptionPane.showMessageDialog(this, "Jorge Ivan Morales                0832721\nPaola Andrea Garcia             0835511\nCesar Augusto Banguero     0842184\n", "Autores", JOptionPane.INFORMATION_MESSAGE);
	 }
        if(e.getSource() == abrir){
            abrirArchivo();
//            new Nodo(matriz,0,null,null,0);
                    
        }
        if(e.getSource() == salir){
            System.exit(0);
        }
        if(e.getSource()==amplitud)
        {
            limpiarInfo();
            cargarMapa();            
            nAlgoritmo.append(amplitud.getText());
            ejecutar.setEnabled(true);
             
        }
        if(e.getSource() == costo){
            limpiarInfo();
            cargarMapa();
            nAlgoritmo.append(costo.getText());
            ejecutar.setEnabled(true);
            
//            canvas.animarSolucion(busqCosto.BusquedaCostoUniforme().reconstruirSolucion());
        }
        if(e.getSource()==profundidad)
        {
            limpiarInfo();
            cargarMapa();
            nAlgoritmo.append("Preferente por profundidad");
            ejecutar.setEnabled(true);
           
        }
        
        if(e.getSource()==avara)
        {
            limpiarInfo();
            cargarMapa();
            nAlgoritmo.append(avara.getText());
            ejecutar.setEnabled(true);
        }
        
        if(e.getSource()==aEstrella)
        {
            limpiarInfo();
            cargarMapa();
            nAlgoritmo.append(aEstrella.getText());
            ejecutar.setEnabled(true);
        }
        if(e.getSource()==ejecutar){
        
            if(nAlgoritmo.getText().equals(amplitud.getText())){
                BusquedaPreferenteAmplitud busqAmp=new BusquedaPreferenteAmplitud(matriz);
                ArrayList <String[]> operaciones=busqAmp.AlgoritmoBusquedaPreferenteAmplitud().reconstruirSolucion();                
                tiempo.setText(String.valueOf(busqAmp.duracion)+" ms");
                nodos.setText(String.valueOf(busqAmp.RetornarNodosExpandidos()));
                prof.setText(String.valueOf(busqAmp.AlgoritmoBusquedaPreferenteAmplitud().profundidad));
                for(int i=0;i<operaciones.size();i++)
                {
                    String[] operacion=operaciones.get(i);
                    System.out.println("Carro :"+operacion[0]+" direccion: "+operacion[1]+" numero casillas: "+operacion[2]);
                }
                canvas.animarSolucion(operaciones);
            }
            if(nAlgoritmo.getText().equals(costo.getText())){
                CostoUniforme busqCosto = new CostoUniforme(matriz);
                ArrayList <String[]> operaciones=busqCosto.BusquedaCostoUniforme().reconstruirSolucion();
                for(int i=0;i<operaciones.size();i++)
                {
                    String[] operacion=operaciones.get(i);
                    System.out.println("Carro :"+operacion[0]+" direccion: "+operacion[1]+" numero casillas: "+operacion[2]);
                }
                tiempo.setText(String.valueOf(busqCosto.duracion)+" ms");
                nodos.setText(String.valueOf(busqCosto.RetornarNodosExpandidos()));
                prof.setText(String.valueOf(busqCosto.BusquedaCostoUniforme().profundidad));
                for(int i=0;i<operaciones.size();i++)
                {
                    String[] operacion=operaciones.get(i);
                    System.out.println("Carro :"+operacion[0]+" direccion: "+operacion[1]+" numero casillas: "+operacion[2]);
                }
                canvas.animarSolucion(operaciones);
            }
            if(nAlgoritmo.getText().equals("Preferente por profundidad")){
                PreferenteProfundidadEvitandoCiclos profu=new PreferenteProfundidadEvitandoCiclos(matriz);
               ArrayList <String[]> operaciones=profu.BusquedaPreferenteProfundidadEvitandoCiclos().reconstruirSolucion();
               tiempo.setText(String.valueOf(profu.duracion)+" ms");
                nodos.setText(String.valueOf(profu.RetornarNodosExpandidos()));
                prof.setText(String.valueOf(profu.BusquedaPreferenteProfundidadEvitandoCiclos().profundidad));
                for(int i=0;i<operaciones.size();i++)
                {
                    String[] operacion=operaciones.get(i);
                    System.out.println("Carro :"+operacion[0]+" direccion: "+operacion[1]+" numero casillas: "+operacion[2]);
                }
               canvas.animarSolucion(operaciones);
            }
            if(nAlgoritmo.getText().equals(avara.getText())){
                BusquedaAvara avar=new BusquedaAvara(matriz);
                ArrayList <String[]> operaciones=avar.AlgoritmoBusquedaAvara().reconstruirSolucion();
                tiempo.setText(String.valueOf(avar.duracion)+" ms");
                nodos.setText(String.valueOf(avar.RetornarNodosExpandidos()));
                prof.setText(String.valueOf(avar.AlgoritmoBusquedaAvara().profundidad));
                for(int i=0;i<operaciones.size();i++)
                {
                    String[] operacion=operaciones.get(i);
                    System.out.println("Carro :"+operacion[0]+" direccion: "+operacion[1]+" numero casillas: "+operacion[2]);
                }
                canvas.animarSolucion(operaciones);
                
            }
            if(nAlgoritmo.getText().equals(aEstrella.getText())){
                BusquedaAEstrella estrella=new BusquedaAEstrella(matriz);
                ArrayList <String[]> operaciones=estrella.AlgoritmoBusquedaAEstrella().reconstruirSolucion();
                for(int i=0;i<operaciones.size();i++)
                {
                    String[] operacion=operaciones.get(i);
                    System.out.println("Carro :"+operacion[0]+" direccion: "+operacion[1]+" numero casillas: "+operacion[2]);
                }
                tiempo.setText(String.valueOf(estrella.duracion)+" ms");
                nodos.setText(String.valueOf(estrella.RetornarNodosExpandidos()));
                prof.setText(String.valueOf(estrella.AlgoritmoBusquedaAEstrella().profundidad));
                canvas.animarSolucion(operaciones);
            }
        }
    }
    public void limpiarInfo(){
        
            tiempo.setText("");
            nodos.setText("");
            prof.setText("");
            nAlgoritmo.setText("");
    }
    public void cargarMapa(){
        
        if(canvas!=null){
            
            pCanvas.removeAll();
            canvas = new ProyectoCanvas(matriz);
            pCanvas.add(canvas,BorderLayout.CENTER);
            pCanvas.validate();
            contenedor.validate();
            validate();
            
        }else{
            canvas = new ProyectoCanvas(matriz);
            pCanvas.add(canvas,BorderLayout.CENTER);
            pCanvas.validate();
            contenedor.validate();
        }
    }
    
    public void abrirArchivo(){
        JFileChooser abrirArchivo = new JFileChooser(System.getProperty("user.dir"));
	     int seleccion = abrirArchivo.showOpenDialog(this);
	     
                    
	     if (seleccion == JFileChooser.APPROVE_OPTION) {
                 File mapa = abrirArchivo.getSelectedFile();
                    limpiarInfo();
                    ejecutar.setEnabled(false);
		  if (mapa != null) {
		      try {

                           BufferedReader leerContenido = new BufferedReader(new FileReader(mapa));
			   String fila;
			   int i = 0;
			   matriz = new String[7][7];
			   while ((fila = leerContenido.readLine()) != null) {

				StringTokenizer tokenContenido = new StringTokenizer(fila);
				for (int j = 0; j < 7; j++) {

				    matriz[i][j] = tokenContenido.nextToken();

				}                                
				i++;
			   }
			   leerContenido.close();
                           cargarMapa();
                           algoritmo.setEnabled(true);
		      } catch (Exception ex) {
			   JOptionPane.showMessageDialog(this, "Error al abrir el archivo", "Error", JOptionPane.ERROR_MESSAGE);
		      }
		  }
    }
    }
}
